package com.galaxy.map.service;

import com.galaxy.map.domain.vo.LocationVo;
import com.galaxy.map.model.dto.LocationDTO;
import com.galaxy.map.model.dto.PoiDTO;
import com.galaxy.map.model.dto.RouteDTO;
import com.galaxy.map.model.vo.DistrictVO;
import com.galaxy.map.model.vo.GeocodeVO;
import com.galaxy.map.model.vo.RegeocodeVO;
import com.galaxy.map.model.vo.RouteVO;

import java.util.List;

/**
 * 地图服务接口
 */
public interface IMapService {

    /**
     * 地理编码（地址转坐标）
     *
     * @param address 地址
     * @param city 城市（可选）
     * @return 地理编码结果
     */
    GeocodeVO geocode(String address, String city);

    /**
     * 逆地理编码（坐标转地址）
     *
     * @param location 位置信息（经纬度）
     * @return 逆地理编码结果
     */
    RegeocodeVO regeocode(LocationDTO location);

    /**
     * 计算两点之间的距离
     *
     * @param fromLongitude 起点经度
     * @param fromLatitude 起点纬度
     * @param toLongitude 终点经度
     * @param toLatitude 终点纬度
     * @return 距离（米）
     */
    Double calculateDistance(Double fromLongitude, Double fromLatitude, Double toLongitude, Double toLatitude);

    /**
     * 获取行政区划信息
     *
     * @param keywords 行政区关键字
     * @param subdistrict 返回下级行政区级数
     * @return 行政区划信息
     */
    List<DistrictVO> getDistricts(String keywords, Integer subdistrict);

    /**
     * 获取周边搜索
     *
     * @param location 中心点位置
     * @param keywords 搜索关键字
     * @param radius 搜索半径（单位：米）
     * @return 周边POI列表
     */
    List<PoiDTO> searchAround(LocationDTO location, String keywords, Integer radius);

    /**
     * 步行路线规划
     *
     * @param origin 起点位置
     * @param destination 终点位置
     * @return 步行路线规划结果
     */
    RouteVO planWalkingRoute(LocationDTO origin, LocationDTO destination);

    /**
     * IP定位
     *
     * @param ip IP地址
     * @return 位置信息
     */
    LocationDTO getLocationByIp(String ip);

    String getIp();
}
